package com.hiyee.api.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

/**
 * Service 日志切面类
 *
 * @author WangBin
 */
@Aspect
@Component
public class ServiceLogAspect {

    public final static Logger logger = LoggerFactory.getLogger(ServiceLogAspect.class);

    /**
     * AOP 通知
     * 1、前置通知
     * 2、后置通知
     * 3、环绕通知
     * 4、异常通知
     * 5、最终通知
     */

    /**
     * execution 表达式：
     * 1、* 返回值类型
     * 2、com.hiyee.*.service.impl.. 所有 ServiceImpl 包下及其子包
     * 3、* 类名
     * 4、.* 类方法
     * 5、(..) 方法参数
     */
    @Around("execution(* com.hiyee.*.service.impl..*.*(..))")
    public Object recordTimeOfService(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {

        logger.info("==================开始执行 {}.{}===================",
                proceedingJoinPoint.getTarget().getClass(),
                proceedingJoinPoint.getSignature().getName());
        // 开始时间
        long start = System.currentTimeMillis();
        // 执行 service
        Object result = proceedingJoinPoint.proceed();
        // 运行时间
        long execTime = System.currentTimeMillis() - start;

        if(execTime > 3000) {
            logger.error("当前执行耗时：{}", execTime);
        } else if(execTime > 2000) {
            logger.warn("当前执行耗时：{}", execTime);
        } else {
            logger.info("当前执行耗时：{}", execTime);
        }
        return result;
    }
}
